package pattern17;

/**
 * 4、双检锁/双重校验锁（DCL，即 double-checked locking）
 * JDK 版本：JDK1.5 起
 * <p>
 * 是否 Lazy 初始化：是
 * <p>
 * 是否多线程安全：是
 * <p>
 * 实现难度：较复杂
 * <p>
 * 描述：这种方式采用双锁机制，安全且在多线程情况下能保持高性能。
 * getInstance() 的性能对应用程序很关键。
 *
 * @author wdl
 */
public class Singleton4 {
    /**
     * volatile：保证可见性
     */
    private static volatile Singleton4 instance;
    private Singleton4(){}

    public static Singleton4 getInstance(){
        //判断instance是否存在
        if (instance==null){
            synchronized (Singleton4.class){
                /**
                 * 第二次判断instance是否存在是为了防止多线程同时调用getInstance()方法时
                 * 它们都能够通过第一层instance==null判断，
                 * 由于前面的锁机制，因此仅有一个线程可以进入，其它线程等待
                 * 当进入线程完成实例创建，如果没有第二重判断，其它线程也可以创建新的实例
                 */
                if (instance==null){
                    instance=new Singleton4();
                }
            }
        }
        return instance;
    }
    public void showMessage(){
        System.out.println("双检锁/双重校验锁单例模式");
    }
}
